Prometheus+Clickhouse实现业务告警
点击上方蓝色字体,选择“设为星标”
目前阶段,公司主要监控告警系统使用的是 Zabbix,对于基础设施及应用服务状态监控,Zabbix 内建或由社区贡献了诸多模板,可通过在页面上远程配置或将采集脚本下发至 Zabbix Agent 端进行使用。业务发展至今,除遇到一些并发上的性能问题外,基本能满足我们对于基础硬件、服务设施的监控需求。然而,对于业务类数据,如粒度细至客户分频道的带宽数据,使用 Zabbix 进行监控告警则显得力不从心。
系统构建
Clickhouse 配置
由于 Clickhouse 本身支持类 Graphite 数据表,可定期通过减少时间精度的方式压缩旧数据。我们就以这种数据表类型来存储 Prometheus 的数据。需要在 Clickhouse 集群每个实例的配置文件 config.xml 中最后部分添加如下内容:
<!-- Settings for the ReplicatedGraphiteMergeTree engine. Adjust the retention and rollup entries as needed. -->
<graphite_rollup>
<path_column_name>tags</path_column_name>
<time_column_name>ts</time_column_name>
<value_column_name>val</value_column_name>
<version_column_name>updated</version_column_name>
<default>
<function>avg</function>
<retention>
<age>0</age>
<precision>10</precision>
</retention>
<retention>
<age>86400</age>
<precision>30</precision>
</retention>
<retention>
<age>172800</age>
<precision>300</precision>
</retention>
</default>
</graphite_rollup>
数据中间件部署配置
原始版本的 Prom2Click 存在无法支持配置文件、缺少 log 等问题,我们将其定制添加相应功能后已打成 rpm 包放入内部 YUM 源中。执行如下命令进行安装:
1yum install prom2click
修改 Prom2Click 配置 /usr/local/prom2click/etc/config.yml,填写正确的数据库连接信息。然后启动服务
1systemctl start prom2click
Prometheus 部署配置
目前 Prometheus 已下载至内部 YUM 源中,只需执行如下指令安装
1yum install prometheus2 alertmanager
AlertManager 是 Prometheus 用于告警管理的子模块。其本身并不产生告警,而是接收 Prometheus 根据业务规则持续计算产生的告警数据,并对其进行管理和分发至各种通知通道。
完成安装后,在默认情况下启动,Prometheus 会持续采集自身性能数据,并将采集的数据保存在内置的时序数据库中。为了让 Prometheus 能够将数据保存于 Clickhouse 中并加以使用,我们需在 Prometheus 配置文件(默认位于 /etc/prometheus/prometheus.yml)中添加如下配置项。
read_recent: true # 这个参数很重要,不设置会导致 Prometheus 读取 Remote storage 数据有各种异常,之后重载服务
1systemctl reload prometheus
系统运营
回到最初的业务监控需求,当需要配置某种数据源特定维度上的监控规则时,应该怎么做?摒弃先前的开发数据接口以及开发告警规则,我们现在只要在数据源进行简单配置,然后在 Prometheus 端编写规则配置。
数据转换视图
虽然现在业务数据和 Prometheus 所需的数据都在同一数据源内,但其存储的库、表以及结构都不一致,因此我们需要将待监控的业务数据集从各自的库表中导入到 Prometheus 的库表中。Clickhouse 支持 materialized view,以下简称 MV,它能将一张表中的数据执行特定的查询语句后转存至另一张表。以客户、分频道流量表(存放于xcloud 库的 cdn_nginx_log_flow 表中)为例,我们通过建立如下的 MV,将其导入到 metrics 库的 samples 表中。需要注意的是,这个 MV 只会影响到它建立后新插入到 xcloud.cdn_nginx_log_flow 的数据,如需转换先前的数据,需建立一张临时表,然后在这张临时表上建立同样内容不同名称的临时 MV,将旧数据 select 到临时表中进行转换。最后再删除临时 MV 和临时表。
此外有个风险点是,一旦 MV 的执行逻辑有问题,则会使数据插入到原始表中出错。因此新建 MV 前必须确保逻辑的正确性,可现在内网环境中以测试表进行验证。后续将通过工具进行校验 MV 的合法性。
以上 MV 将会产生一个名称为 cdn_customer_flow 的关于客户、分频道流量的度量指标(metric),其数据维度有 customer, channel, view 和 serverType 这四个。在 Prometheus 的查询页面,我们可通过 PromQL 来对这个度量指标进行查询,如以下语句
1sum by (channel) (sum_over_time(cdn_customer_flow{serverType='0'}[5m]))
可查询最近 5m 各分频道流量的加总。
告警规则配置
在建立数据转换视图后,一旦有新数据插入到原始表,MV 便会持续不断将其变换为 Prometheus 数据表所需格式。此时我们可在 Prometheus 中以标准的规则配置方法对该度量指标进行监控。以下是简要的 Prometheus 配置
则通过 expr 内的计算公式,我们定义了一条告警规则,其内容为:无论哪个客户,只要最近5分钟带宽超过150Mbps,且最近5分钟与上一个5分钟带宽均值变化率超过 10%,则触发告警。Promethues 的告警会由 Alertmanager 进行接收,通过匹配告警名称、标签等,可将告警路由分发至不同的告警通道,比如我们可以定义一个CDN 告警的邮件组专门用于接收以上的告警邮件。
Prometheus 的告警规则很强大,更多的资料可参考官方文档,或是一些不错的第三方文档。
后记
通过以上步骤,我们可以配置绝大多数业务数据的监控规则,利用 Prometheus 的算子,我们甚至可以对某些维度的数据进行预测型监控。但不可否认的是,目前 Prometheus 无论是查询语言或是告警规则的配置,都有一定的学习门槛。我们后续需要做的事,是将整个流程尽可能地界面化,通过在网页页面上选定数据维度、聚合公式、触发阈值、告警通道,来生成相应的告警规则,从而减轻运营人员的操作门槛,让整个系统更易运营。
文章不错?点个【在看】吧! 👇